package br.com.ff.manager.managebean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import br.com.ff.cliente.session.ClienteLocal;
import br.com.ff.cliente.to.ClienteTO;
import br.com.ff.common.StatusEnum;
import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.equipamento.session.EquipamentoLocal;
import br.com.ff.equipamento.to.EquipamentoTO;
import br.com.ff.manager.managebean.base.BaseManagedBean;
import br.com.ff.tipoveiculo.session.TipoVeiculoLocal;
import br.com.ff.tipoveiculo.to.TipoVeiculoTO;
import br.com.ff.veiculo.session.VeiculoLocal;
import br.com.ff.veiculo.to.VeiculoTO;

public class CrudVeiculo extends BaseManagedBean {
	
	@EJB
	private VeiculoLocal veiculoLocal;
	
	@EJB
	private ClienteLocal clienteLocal;
	
	@EJB
	private TipoVeiculoLocal tipoVeiculoLocal;
	
	@EJB
	private EquipamentoLocal EquipamentoLocal;
	
	private VeiculoTO veiculoTO = new VeiculoTO();
	
	private List<VeiculoTO> veiculos = new ArrayList<VeiculoTO>();
	
	private List<SelectItem> clientes = new ArrayList<SelectItem>();
	
	private List<SelectItem> equipamentos = new ArrayList<SelectItem>();
	
	private List<SelectItem> listaStatus = new ArrayList<SelectItem>();
	private int statusValue;
	
	private List<SelectItem> tiposVeiculos = new ArrayList<SelectItem>();
	
	private boolean exibirTabela = false;
		
	
	public void goEditar(ActionEvent event) throws IOException {
		UIParameter component = (UIParameter) event.getComponent().findComponent("id");
		Long id = (Long)component.getValue();
		
		veiculoTO = getVeiculoLocal().findById(id);
		statusValue = veiculoTO.getStatus().getStatus();
		clientes = carregarListaClientes();
		tiposVeiculos = carregarTiposVeiculos();
		equipamentos = carregarListaEquipamentosDisponiveis();
		
		redirecionarPara("salvarVeiculo.xhtml");
	}
	
	private void limpar() {
		veiculoTO = new VeiculoTO();
		statusValue = -1;
		clientes = carregarListaClientes();
		tiposVeiculos = carregarTiposVeiculos();
		veiculos = new ArrayList<VeiculoTO>(); 
		
	}
	
	public String goIncluir() throws IOException {
		limpar();
		equipamentos = carregarListaEquipamentosDisponiveis();
		return "go_salvar";
	}
	
	public String consultar() throws IOException {
		VeiculoTO veiculoParam = getVeiculoTO();
		
		if (StatusEnum.ATIVO.getStatus() == getStatusValue()) {
			veiculoParam.setStatus(StatusEnum.ATIVO);
		} else if (StatusEnum.INATIVO.getStatus() == getStatusValue()){
			veiculoParam.setStatus(StatusEnum.INATIVO);
		} else {
			veiculoParam.setStatus(null);
		}
		
		this.veiculos = getVeiculoLocal().findByParams(veiculoParam);
		return "success";
	}

	
	
	
	
	
	
	
	
	
	
	
	public String salvar() throws IOException {
		
		String placa = getVeiculoTO().getPlaca();
		String descricao = getVeiculoTO().getDescricao();
		TipoVeiculoTO tipoVeiculo = getVeiculoTO().getTipoVeiculo();
		
		if (getStatusValue() < 1) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Status e obrigatorio."));
		}
		
		if (getVeiculoTO().getCliente() == null) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Cliente e obrigatorio."));
		}
		
		if (placa == null || placa.equals("")) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Placa e obrigatorio"));
		}
		
		if (descricao == null || descricao.equals("")) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Descricao e obrigatorio"));
		}
		
		if (tipoVeiculo == null || tipoVeiculo.getTipoVeiculo().equals("")) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Tipo Veiculo e obrigatorio"));
		}
		
		if (FacesContext.getCurrentInstance().getMessages().hasNext()) {
			return "";
		}
		
		if (getStatusValue() == 1) {
			getVeiculoTO().setStatus(StatusEnum.ATIVO);
		} else {
			getVeiculoTO().setStatus(StatusEnum.INATIVO);
		}
		
		try {
			if (getVeiculoTO().getId() != null) {
				getVeiculoLocal().atualizar(getVeiculoTO());
			} else {
				getVeiculoLocal().salvar(getVeiculoTO());
			}
		} catch (EntidadeDuplicadaException e) {
			FacesContext.getCurrentInstance().addMessage("", new FacesMessage(e.getMessage()));
			return "";
		}
		
		limpar();
		
		redirecionarPara("msgSucesso.xhtml?url=consultarVeiculo.xhtml");
		
		return "success";
	}
	
	public void remover(ActionEvent event) throws IOException {
		
		UIParameter component = (UIParameter) event.getComponent().findComponent("id");
		Long id = (Long)component.getValue();
		getVeiculoLocal().remover(id);
		
		limpar();
		
		redirecionarPara("msgSucesso.xhtml?url=consultarVeiculo.xhtml");
		
	}
	
	private List<SelectItem> carregarListaClientes() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		
		lista.add(new SelectItem(null, " - Selecione - "));
		
		ClienteTO clienteTO = new ClienteTO();
		clienteTO.setStatus(StatusEnum.ATIVO);
		List<ClienteTO> clientes = getClienteLocal().findByParams(clienteTO);
		
		for (ClienteTO clienteTO2 : clientes) {
			lista.add(new SelectItem(clienteTO2, clienteTO2.getNome()));
		}
		
		return lista;
	}
	
	private List<SelectItem> carregarListaEquipamentosDisponiveis() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		
		lista.add(new SelectItem(null, " - Selecione - "));
		
		if (getVeiculoTO().getEquipamentoSrn() != null && !getVeiculoTO().getEquipamentoSrn().equals("")) {
			lista.add(new SelectItem(getVeiculoTO().getEquipamentoSrn(), getVeiculoTO().getEquipamentoSrn()));
		}
		
		List<EquipamentoTO> equipamentos = getEquipamentoLocal().findEquipamentosDisponiveis();
		
		for (EquipamentoTO equipamentoTO2 : equipamentos) {
			lista.add(new SelectItem(equipamentoTO2.getSerial(), equipamentoTO2.getSerial()));
		}
		
		return lista;		
	}
	
	private List<SelectItem> carregarTiposVeiculos() {
		
		List<SelectItem> lista = new ArrayList<SelectItem>();
		
		lista.add(new SelectItem(null, " - Selecione - "));
		
		List<TipoVeiculoTO> tiposVeiculosList = getTipoVeiculoLocal().findAll();
		for (TipoVeiculoTO tipoVeiculoTO : tiposVeiculosList) {
			lista.add(new SelectItem(tipoVeiculoTO, tipoVeiculoTO.getTipoVeiculo()));
		}
		return lista;
		
	}

	public VeiculoLocal getVeiculoLocal() {
		return veiculoLocal;
	}

	public void setVeiculoLocal(VeiculoLocal veiculoLocal) {
		this.veiculoLocal = veiculoLocal;
	}

	public VeiculoTO getVeiculoTO() {
		return veiculoTO;
	}

	public void setVeiculoTO(VeiculoTO veiculoTO) {
		this.veiculoTO = veiculoTO;
	}

	public List<VeiculoTO> getVeiculos() {
		return veiculos;
	}

	public void setVeiculos(List<VeiculoTO> versoes) {
		this.veiculos = versoes;
	}

	public List<SelectItem> getClientes() {
		if (clientes.isEmpty()) {
			clientes = carregarListaClientes();
		}
		return clientes;
	}

	public void setClientes(List<SelectItem> clientes) {
		this.clientes = clientes;
	}

	public List<SelectItem> getListaStatus() {
		
		if (listaStatus.isEmpty()) {
			listaStatus = gerarListStatus();
		}
		return listaStatus;
		
	}

	public void setListaStatus(List<SelectItem> listaStatus) {
		this.listaStatus = listaStatus;
	}

	public int getStatusValue() {
		return statusValue;
	}

	public void setStatusValue(int statusValue) {
		this.statusValue = statusValue;
	}
	
	public boolean isExibirTabela() {
		if (!veiculos.isEmpty()) {
			exibirTabela = true; 
		} else {
			exibirTabela = false;
		}
		return exibirTabela;
	}

	public void setExibirTabela(boolean exibirTabela) {
		this.exibirTabela = exibirTabela;
	}

	public ClienteLocal getClienteLocal() {
		return clienteLocal;
	}

	public void setClienteLocal(ClienteLocal clienteLocal) {
		this.clienteLocal = clienteLocal;
	}

	public TipoVeiculoLocal getTipoVeiculoLocal() {
		return tipoVeiculoLocal;
	}

	public void setTipoVeiculoLocal(TipoVeiculoLocal tipoVeiculoLocal) {
		this.tipoVeiculoLocal = tipoVeiculoLocal;
	}

	public List<SelectItem> getTiposVeiculos() {
		if (tiposVeiculos.isEmpty()) {
			tiposVeiculos = carregarTiposVeiculos();
		}
		return tiposVeiculos;
	}

	public void setTiposVeiculos(List<SelectItem> tiposVeiculos) {
		this.tiposVeiculos = tiposVeiculos;
	}

	public List<SelectItem> getEquipamentos() {
		
		if (equipamentos.isEmpty()) {
			equipamentos = carregarListaEquipamentosDisponiveis();
		}
		
		return equipamentos;
	}

	public void setEquipamentos(List<SelectItem> equipamentos) {
		this.equipamentos = equipamentos;
	}

	public EquipamentoLocal getEquipamentoLocal() {
		return EquipamentoLocal;
	}

	public void setEquipamentoLocal(EquipamentoLocal equipamentoLocal) {
		this.EquipamentoLocal = equipamentoLocal;
	}
	
}
